VALUE – FOR – IN mit Zähler und ChatGPT

Ich hatte mal wieder ein Programmierproblem: Für die Übernahme von Positionsdaten aus der Tabelle INPUTS in die Tabelle BAPI_ITEMS für den BAPI-Aufruf habe ich das VALUE-Konstrukt mit FOR wa IN itab benutzt:
bapi_items = VALUE #( FOR line IN inputs ( material = line-matnr quantity = line-menge ) ).
Diese Schreibweise habe ich mir angewöhnt, weil sie schön, kurz und prägnant ist.
Die Typen und Tabellen habe ich für das Beispiel gewohnt einfach gehalten. Sie sehen wie folgt aus:
TYPES: BEGIN OF _input, matnr TYPE c LENGTH 10, menge TYPE p DECIMALS 2, END OF _input, _inputs TYPE TABLE OF _input WITH DEFAULT KEY. TYPES: BEGIN OF _bapi_item, itm_number TYPE posnr, material TYPE matnr, quantity TYPE menge_d, END OF _bapi_item, _bapi_items TYPE TABLE OF _bapi_item WITH DEFAULT KEY. DATA(inputs) = VALUE _inputs( ( matnr = 'AA' menge = 11 ) ( matnr = 'BB' menge = 22 ) ( matnr = 'CC' menge = 33 ) ). DATA bapi_items TYPE _bapi_items.
Ich wollte nun jedoch die Positionsnummer mit in die Schleife bringen. Die ersten Versuche, SY-INDEX oder SY-TABIX zu verwenden, funktionierten nicht. Danach habe ich etwas mit LET herumgespielt, aber keine Lösung finden können. Weder in der SAP-Community noch auf den einschlägigen “Tricktresor-Konkurrenzseiten” konnte ich entsprechende Lösungen finden. Auch in der SAP-Hilfe bin ich nicht über ein passendes Beispiel gestolpert.
Bevor ich die VALUE-FOR-Anweisung jedoch in einen LOOP umbaue, habe ich ChatGPT gefragt, was es für Möglichkeiten gibt. Das mache ich immer mal wieder gerne, um zu prüfen, wie sinnvoll der Einsatz von ChatGPT im SAP-/ ABAP-Umfeld ist.
ChatGPT hat mir zwei Lösungen vorgeschlagen.
Variante 1
Für die erste Variante hat ChatGPT ebenfalls die VALUE-Anweisung genutzt, allerdings in Verbindung mit FOR – UNTIL. Die Variante war syntaktisch korrekt und funktioniert wie gewünscht:
bapi_items = VALUE #( FOR i = 1 UNTIL i > lines( inputs ) LET line = inputs[ i ] IN ( itm_number = i material = line-matnr quantity = line-menge ) ).
Variante 2
Die zweite Variante sah, bis auf einen offensichtlichen Syntaxfehler, ebenfalls vielversprechend aus:
DATA(lv_posnr) = 0. bapi_items = VALUE #( FOR line IN inputs LET lv_dummy = lv_posnr = lv_posnr + 1 IN ( itm_number = lv_dummy material = line-matnr quantity = line-menge ) ).
Die doppelte Zuweisung habe ich entfernt, allerdings funktioniert das Coding nicht wie gewünscht: Die Positionsnummer ist immer “1”.
Variante 3
Damit hätte ich immerhin meine Lösung gehabt, allerdings bin ich irgendwo noch auf den Zusatz INDEX INTO gestoßen. Leider weiß ich nicht mehr, wo… Der Zusatz macht jedoch genau das, was man erwarten würde und was ich gesucht habe:
bapi_items = VALUE _bapi_items( FOR line IN inputs INDEX INTO idx ( itm_number = idx material = line-matnr quantity = line-menge ) ).
In der Hilfe zu VALUE – FOR – IN ist er auch beschrieben. Ich habe ihn nur nicht gefunden.
Fazit
Kleiner Zusatz – große Wirkung. Man muss es nur wissen. Obwohl ich die SAP-Hilfe inzwischen wirklich gut finde, nicht zuletzt wegen der vielen Beispiele, ist es in dem Dschungel der Varianten und Zusätze manchmal schwer, die richtige Option zu finden.
Auf die Nachfrage bei ChatGPT, was mit INDEX INTO wäre, Antwortet es:
Gute Frage — ABAPs FOR-Expressionen haben keinen
INDEX INTO
-Konstrukt so wie die klassischeLOOP
.
Was nun wirklich komplett falsch ist. Erst auf den Hinweis, dass es nicht stimmt, hat ChatGPT dann die richtige Variante ausgespuckt.
ChatGPT macht Fehler und ist trotzdem hilfreich. Dadurch, dass die Annahmen und zusätzliche Hinweise erörtert werden, bekommt man eine andere Sichtweise und zusätzliche Hinweise, die bei der Lösungssuche helfen. Ich nehme an, dass spezialisierte KI’s wie SAP Joule hier deutlich besser sind.
- VALUE – FOR – IN mit Zähler und ChatGPT - 23. Juni 2025
- S/4HANA Migration – The Beginning - 25. März 2025
- 7. December: Excel Racing Simulation – Root Vole Race - 7. Dezember 2024